// package: rewords-server-2024
// filename: mdo
// author: diogoxiang@gmail.com
// time: 2024/8/1 上午10:10

package mdo

import "time"

// UserInfo  用户信息
/**
collection = "c_user"
*/
type UserInfo struct {
	// 公共字段，id和时间
	PublicFields `bson:",inline"`
	Uid          int    `bson:"uid" json:"uid"`
	Username     string `bson:"username" json:"username"`
	//  在tag里面加上 omitempty，可以在序列化的时候忽略0值或者空值
	Password string `bson:"password" json:"password"`
	NickName string `bson:"nick_name,omitempty" json:"nick_name,omitempty"`
	HeadImg  string `bson:"head_img,omitempty" json:"head_img,omitempty"`
	Salt     string `bson:"salt,omitempty"  json:"salt,omitempty"`
	Email    string `bson:"email,omitempty" json:"email,omitempty"`

	// 用户权限（1：管理员，2：编辑(新建)权限 3:查看）
	Role Role `bson:"role,omitempty" json:"role,omitempty"`
	// 用户状态 0,1 为正常  -1 为禁止
	Status UserStatus `bson:"status,omitempty" json:"status,omitempty"`
	//  用户等级
	Level Level `bson:"level,omitempty"  json:"level,omitempty"`

	// 用户类别 pc / h5 / 小程序
	Utype UserType `bson:"utype,omitempty" json:"utype,omitempty"`

	// 用户积分 后续, 可用于兑换活动, 初始都为0
	Points int `bson:"points" json:"points"`
}

// UserStatus 用户状态 0,1 为正常  -1为禁止
type UserStatus int

const (
	UserBanned  UserStatus = -1
	UserActived UserStatus = 1
)

func (s UserStatus) Defined() bool {
	switch s {
	case UserBanned, UserActived:
		return true
	}
	return false
}

// Role 用户权限
type Role int

const (
	// ManageRole 管理的权限
	ManageRole Role = iota + 1
	// EditRole 编辑权限
	EditRole
	// ViewRole 查看权限
	ViewRole
)

func (s Role) Defined() bool {
	switch s {
	case ManageRole, EditRole, ViewRole:
		return true
	}
	return false
}

// Level 用户等级 不同等级支持,支持不同功能
type Level int

// UserType 用户类别 1:pc 2:h5 3:小程序 0:其他
type UserType int

// UserList 用户列表信息 分页参数
type UserList struct {
	Page      int // 当前页码
	PageCount int // 当前页面的数量
	TotalNum  int // 数量总数
	List      []UserInfo
}

/**
collection = "c_user_wx"
*/

// WxBase 微信信息 2022
type WxBase struct {
	// 公共字段，id和时间
	PublicFields `bson:",inline"`
	Uid          int    `bson:"uid" json:"uid"`
	Openid       string `bson:"openid" json:"openid"`
	AvatarUrl    string `bson:"avatar_url" json:"avatar_url"`
	UnionId      string `bson:"union_id,omitempty" json:"union_id,omitempty"`
	NickName     string `bson:"nick_name" json:"nick_name"`
}

// WxBaseExt 针对 基本信息的补充
type WxBaseExt struct {
	WxBase `bson:",inline"`
	// 用户状态 0,1 为正常  -1 为禁止
	Status UserStatus `bson:"status,omitempty" json:"status,omitempty"`
	//  用户等级
	Level Level `bson:"level,omitempty"  json:"level,omitempty"`
	// 用户类别 pc / h5 / 小程序
	//Utype UserType `bson:"utype,omitempty" json:"utype,omitempty"`
	// 用户积分 后续, 可用于兑换活动, 初始都为0
	Points int `bson:"points" json:"points"`
	// 手机号
	Phone string `bson:"phone" json:"phone"`
}

// WxBaseOut 这个数据主要是用于返回给 移动端或是 缓存
type WxBaseOut struct {
	Uid       int    `bson:"uid" json:"uid"`
	Openid    string `bson:"openid" json:"openid"`
	AvatarUrl string `bson:"avatar_url" json:"avatarUrl"`
	UnionId   string `bson:"union_id,omitempty" json:"unionId,omitempty"`
	NickName  string `bson:"nick_name" json:"nickName"`
	// 用户状态 0,1 为正常  -1 为禁止
	Status UserStatus `bson:"status,omitempty" json:"status,omitempty"`
	//  用户等级
	Level Level `bson:"level,omitempty"  json:"level,omitempty"`
	// 用户类别 pc / h5 / 小程序
	//Utype UserType `bson:"utype,omitempty" json:"utype,omitempty"`
	// 用户积分 后续, 可用于兑换活动, 初始都为0
	Points int `bson:"points" json:"points"`
	// 手机号
	Phone string `bson:"phone" json:"phone"`
}

/**
collection = "c_user_wx_login"
*/

// WxBaseLog 主要用于缓存
type WxBaseLog struct {
	Openid     string `bson:"openid" json:"openid"`
	UnionId    string `bson:"union_id,omitempty" json:"unionId,omitempty"`
	SessionKey string `bson:"session_key" json:"sessionKey"`
}

// WxPointlog 主要用于积分记录
type WxPointlog struct {
	Openid    string    `bson:"openid" json:"-"` // 不用返回给前端
	Points    int       `bson:"points" json:"points"`
	Remark    string    `bson:"remark" json:"remark"`
	CreatedAt time.Time `bson:"created_at" json:"-"` // 创建时间
	Ctime     int64     `bson:"ctime,omitempty" json:"ctime,omitempty"`
}
